package thread.threadpool.example2;


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;

/**
 * @Description: 练习工厂类ExecuTors的newCachedThreadPool方法获取ExecutorService，然后调用submit方法，提交任务
 *
 * 三种创建线程池的区别
 * 第一种：newCachedThreadPool：线程的数据是不做限制的，每次有任务来的时候都会以任务优先，性能最大化（也就是服务器压力比较大）
 *
 * 第二种：newFixedThreadPool：可以让压力不那么大，并且可以规定线程的数量，当线程的数量达到指定数量的时候，这个时候就不会再有新的线程了
 *
 * 第三种：newSingleThreadExecutor：绝对的安全，不考虑性能，因为是单线程，永远只有一个线程来执行任务。
 *
 * @date: 2023/1/30 11:18
 * @author: Huangjunjie
 * @since JDK 1.8
 */
public class ExecuTorsTest1 {
    public static void main(String[] args) {
//        func1();
        func2();
    }

    private static void func1() {
        //使用 newCachedThreadPool方法得到线程池对象
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            //执行线程
            executorService.submit(new MyRunnable(i));
        }
    }

    private static void func2() {
        //newCachedThreadPool(ThreadFactory threadFactory)方法得到线程池对象
        ExecutorService executorService = Executors.newCachedThreadPool(new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                return new Thread(r);
            }
        });
        for (int i = 0; i < 10; i++) {
            //执行线程
            executorService.submit(new MyRunnable(i));
        }
    }

}
